/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.applicatioN.controllers;

import com.applicatioN.controllers.exceptions.NonexistentEntityException;
import com.applicatioN.controllers.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.applicatioN.entities.Agent;
import com.applicatioN.entities.Grade;
import com.applicatioN.entities.TravaillerAvec;
import com.applicatioN.entities.TravaillerAvecPK;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Asus_k53s
 */
public class TravaillerAvecJpaController implements Serializable {

    public TravaillerAvecJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(TravaillerAvec travaillerAvec) throws PreexistingEntityException, Exception {
        if (travaillerAvec.getTravaillerAvecPK() == null) {
            travaillerAvec.setTravaillerAvecPK(new TravaillerAvecPK());
        }
        travaillerAvec.getTravaillerAvecPK().setNumeroDeMatricule(travaillerAvec.getAgent().getNumeroDeMatricule());
        travaillerAvec.getTravaillerAvecPK().setNomGrade(travaillerAvec.getGrade().getNomGrade());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Agent agent = travaillerAvec.getAgent();
            if (agent != null) {
                agent = em.getReference(agent.getClass(), agent.getNumeroDeMatricule());
                travaillerAvec.setAgent(agent);
            }
            Grade grade = travaillerAvec.getGrade();
            if (grade != null) {
                grade = em.getReference(grade.getClass(), grade.getNomGrade());
                travaillerAvec.setGrade(grade);
            }
            em.persist(travaillerAvec);
            if (agent != null) {
                agent.getTravaillerAvecCollection().add(travaillerAvec);
                agent = em.merge(agent);
            }
            if (grade != null) {
                grade.getTravaillerAvecCollection().add(travaillerAvec);
                grade = em.merge(grade);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findTravaillerAvec(travaillerAvec.getTravaillerAvecPK()) != null) {
                throw new PreexistingEntityException("TravaillerAvec " + travaillerAvec + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(TravaillerAvec travaillerAvec) throws NonexistentEntityException, Exception {
        travaillerAvec.getTravaillerAvecPK().setNumeroDeMatricule(travaillerAvec.getAgent().getNumeroDeMatricule());
        travaillerAvec.getTravaillerAvecPK().setNomGrade(travaillerAvec.getGrade().getNomGrade());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            TravaillerAvec persistentTravaillerAvec = em.find(TravaillerAvec.class, travaillerAvec.getTravaillerAvecPK());
            Agent agentOld = persistentTravaillerAvec.getAgent();
            Agent agentNew = travaillerAvec.getAgent();
            Grade gradeOld = persistentTravaillerAvec.getGrade();
            Grade gradeNew = travaillerAvec.getGrade();
            if (agentNew != null) {
                agentNew = em.getReference(agentNew.getClass(), agentNew.getNumeroDeMatricule());
                travaillerAvec.setAgent(agentNew);
            }
            if (gradeNew != null) {
                gradeNew = em.getReference(gradeNew.getClass(), gradeNew.getNomGrade());
                travaillerAvec.setGrade(gradeNew);
            }
            travaillerAvec = em.merge(travaillerAvec);
            if (agentOld != null && !agentOld.equals(agentNew)) {
                agentOld.getTravaillerAvecCollection().remove(travaillerAvec);
                agentOld = em.merge(agentOld);
            }
            if (agentNew != null && !agentNew.equals(agentOld)) {
                agentNew.getTravaillerAvecCollection().add(travaillerAvec);
                agentNew = em.merge(agentNew);
            }
            if (gradeOld != null && !gradeOld.equals(gradeNew)) {
                gradeOld.getTravaillerAvecCollection().remove(travaillerAvec);
                gradeOld = em.merge(gradeOld);
            }
            if (gradeNew != null && !gradeNew.equals(gradeOld)) {
                gradeNew.getTravaillerAvecCollection().add(travaillerAvec);
                gradeNew = em.merge(gradeNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                TravaillerAvecPK id = travaillerAvec.getTravaillerAvecPK();
                if (findTravaillerAvec(id) == null) {
                    throw new NonexistentEntityException("The travaillerAvec with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(TravaillerAvecPK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            TravaillerAvec travaillerAvec;
            try {
                travaillerAvec = em.getReference(TravaillerAvec.class, id);
                travaillerAvec.getTravaillerAvecPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The travaillerAvec with id " + id + " no longer exists.", enfe);
            }
            Agent agent = travaillerAvec.getAgent();
            if (agent != null) {
                agent.getTravaillerAvecCollection().remove(travaillerAvec);
                agent = em.merge(agent);
            }
            Grade grade = travaillerAvec.getGrade();
            if (grade != null) {
                grade.getTravaillerAvecCollection().remove(travaillerAvec);
                grade = em.merge(grade);
            }
            em.remove(travaillerAvec);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<TravaillerAvec> findTravaillerAvecEntities() {
        return findTravaillerAvecEntities(true, -1, -1);
    }

    public List<TravaillerAvec> findTravaillerAvecEntities(int maxResults, int firstResult) {
        return findTravaillerAvecEntities(false, maxResults, firstResult);
    }

    private List<TravaillerAvec> findTravaillerAvecEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(TravaillerAvec.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public TravaillerAvec findTravaillerAvec(TravaillerAvecPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(TravaillerAvec.class, id);
        } finally {
            em.close();
        }
    }

    public int getTravaillerAvecCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<TravaillerAvec> rt = cq.from(TravaillerAvec.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
